package problemas;

import java.util.LinkedList;
import java.util.List;

import busca.BuscaLargura;
import busca.BuscaProfundidade;
import busca.BuscaProfundidadeIterativa;
import busca.Estado;
import busca.No;

public class EstadoAspiradorDePo implements Estado{
	
	/**
	 * Informacoes sobre operacao 
	 */
	private String op;
	
	private int ladoEsquerdo;
	private int ladoDireito;
	private int posicao;
	
	public int custo() {
		return 1;
	}

	public boolean isGoal() {
		if(this.ladoEsquerdo==Espaco.LIMPO && this.ladoDireito==Espaco.LIMPO)
			return true;
		else
			return false;
	}

	/**
	 * retorna sucessores
	 */
	public List<Estado> sucessores() {
		List<Estado> sucessores = new LinkedList<Estado>();
		//mover para a esquerda
		sucessores.add(new EstadoAspiradorDePo(Espaco.ESQUERDA,this.ladoDireito,this.ladoEsquerdo, "Para a esquerda"));
		//mover para a direita
		sucessores.add(new EstadoAspiradorDePo(Espaco.DIREITA,this.ladoDireito,this.ladoEsquerdo, "Para a direita"));
		//limpar
		if(this.posicao==Espaco.DIREITA)
			sucessores.add(new EstadoAspiradorDePo(this.posicao,Espaco.LIMPO,this.ladoEsquerdo, "Limpar o quarto da direita"));
		else
			sucessores.add(new EstadoAspiradorDePo(this.posicao,this.ladoDireito,Espaco.LIMPO, "Limpar o quarto da esquerda"));
		
		return sucessores;
	}
	
	public EstadoAspiradorDePo(int posicao, int situacaoDireita, int situacaoEsquerda, String op){
		this.posicao = posicao;
		this.ladoDireito = situacaoDireita;
		this.ladoEsquerdo = situacaoEsquerda;
		this.op = op;
	}
	
	
	public String toString(){
		return op + " -> ";
	}
	
	public static void main(String args[]){
		EstadoAspiradorDePo inicial = new EstadoAspiradorDePo(Espaco.DIREITA,Espaco.SUJO,Espaco.SUJO,"");
		System.out.println("busca em largura");
		No n = new BuscaLargura().busca(inicial);
		if (n == null) {
			System.out.println("sem solucao!");
		} else {
			System.out.println("solucao:\n" + n.retornaCaminho() + "\n\n");
		}
		
		EstadoAspiradorDePo inicial2 = new EstadoAspiradorDePo(Espaco.DIREITA,Espaco.SUJO,Espaco.SUJO,"");
		System.out.println("busca em profundidade");
		No n2 = new BuscaProfundidade().busca(inicial2);
		if (n2 == null) {
			System.out.println("sem solucao!");
		} else {
			System.out.println("solucao:\n" + n2.retornaCaminho() + "\n\n");
		}
		
		EstadoAspiradorDePo inicial3 = new EstadoAspiradorDePo(Espaco.DIREITA,Espaco.SUJO,Espaco.SUJO,"");
		System.out.println("busca iterativa");
		No n3 = new BuscaProfundidadeIterativa().busca(inicial3);
		if (n3 == null) {
			System.out.println("sem solucao!");
		} else {
			System.out.println("solucao:\n" + n3.retornaCaminho() + "\n\n");
		}
	}

}

class Espaco{
	public static int SUJO = 1;
	public static int LIMPO = 0;
	
	public static int DIREITA = 1;
	public static int ESQUERDA = 0;
}




